package navalgo3.Vista;
import navalgo3.Modelo.*;
import navalgo3.Controlador.*;
import javax.swing.*;
import java.awt.*;
import java.util.ArrayList;
import java.util.Observable;
import java.util.Observer;
import javax.swing.ImageIcon;


public class VistaTablero implements Observer {
    
	private Juego referenciaAlJuego = new Juego();
	PanelConFondo celdas[][] = new PanelConFondo[10][10];
	Image imagenMar = new ImageIcon(getClass().getResource("mar.jpg")).getImage();
	private Button botonPasarTurno = new Button("Pasar Turno");
	private Button botonDisparar = new Button("Disparar");
	private Button botonColocarMina = new Button("Colocar Mina");
	@SuppressWarnings("rawtypes")
	private JComboBox comboFila = new JComboBox();
	@SuppressWarnings("rawtypes")
	private JComboBox comboColumna = new JComboBox();
	JTextArea areaTexto = new JTextArea("Seleccione una fila \n y una Columna");


    public VistaTablero(Juego referenciaAlJuego,ControladorPrincipal control){
    	JFrame frame;
        frame = new JFrame("Batalla Navalgo");
        frame.setSize(1000, 750);
        Container pane = new Container();
        pane.setLayout(new BorderLayout());
        pane.setName("Batalla Navalgo");
        pane.setSize(1000, 750);
        pane.add(getTitulo(), BorderLayout.NORTH);
        pane.add(getTableroPrincipal(), BorderLayout.CENTER);
        pane.add(getBotoneraDerecha(), BorderLayout.EAST);
        frame.add(pane);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
        this.referenciaAlJuego = referenciaAlJuego;
		this.referenciaAlJuego.addObserver(this); 
		botonPasarTurno.addActionListener(control.getListenerBotonPasarTurno());
		comboFila.addActionListener(control.getListenerSeleccionFila());
		comboColumna.addActionListener(control.getListenerSeleccionColumna());
		
    }

    protected JComponent getTitulo() {
    	JLabel label = new JLabel("Batalla Navalgo", JLabel.CENTER);
        label.setFont(new Font("Courier", Font.BOLD, 28));
        return label;
    }

	protected JComponent getBotoneraDerecha() {
    	JPanel panelDeBotonesDerecho = new JPanel();
    	panelDeBotonesDerecho.setLayout(new GridBagLayout());
    	GridBagConstraints constraints1 = new GridBagConstraints();
    	constraints1.gridx = 0;
    	constraints1.weightx = 0;
    	constraints1.gridy = 0;
    	constraints1.weighty = 1.0;
    	constraints1.gridwidth = 1; 
    	constraints1.gridheight = 1; 
    	panelDeBotonesDerecho.add(areaTexto, constraints1);
    	panelDeBotonesDerecho.add(comboColumna);
        panelDeBotonesDerecho.add(comboFila);
    	
    	GridBagConstraints constraints2 = new GridBagConstraints();
    	constraints2.gridx = 0; 
    	constraints2.weightx = 2.0;
    	constraints2.gridy = 1;
    	constraints2.weighty = 2.0;
    	constraints2.gridwidth = 1; 
    	constraints2.gridheight = 1;
    	panelDeBotonesDerecho.add(botonPasarTurno,constraints2);
    	
    	GridBagConstraints constraints3 = new GridBagConstraints();
    	constraints3.gridx = 1; 
    	constraints3.weightx = 2.0;
    	constraints3.gridy = 1;
    	constraints3.weighty = 2.0;
    	constraints3.gridwidth = 1; 
    	constraints3.gridheight = 1;
    	panelDeBotonesDerecho.add(botonDisparar,constraints3);
    	
    	GridBagConstraints constraints4 = new GridBagConstraints();
    	constraints4.gridx = 2; 
    	constraints4.weightx = 2.0;
    	constraints4.gridy = 1;
    	constraints4.weighty = 2.0;
    	constraints4.gridwidth = 1; 
    	constraints4.gridheight = 1;
    	panelDeBotonesDerecho.add(botonColocarMina,constraints4);
    
        for (int i = 1; i < 11; i++){
        	comboColumna.addItem(" "+i);
        	comboFila.addItem(" "+i);
        }
        return panelDeBotonesDerecho;
    }
                 
    protected JComponent getTableroPrincipal(){
        JPanel grilla = new JPanel();
        grilla.setLayout(new GridLayout(10, 10, 1, 1));
        for (int i = 0; i < 10; i++) {
        	for (int j = 0; j < 10; j++) {
        		celdas[i][j] = new PanelConFondo();
                grilla.add(celdas[i][j]);
            }
        }
                               
        for (int i = 0; i < 10; i++) {
        	for (int j = 0; j < 10; j++) {
        		celdas[i][j].setImagen(imagenMar);
            }
        }
        return grilla;
    }
    
    protected void actualizarGrilla(Posicion posicionActual, Nave naveActual){
    	int columna, fila;
    	columna = posicionActual.getFila()-1;
    	fila = posicionActual.getColumna()-1;
    	celdas[columna][fila].setImagen(naveActual.dameTuImagen(posicionActual));
    }
    
    protected void dibujarMar(Posicion posicionActual){
    	int columna, fila;
    	columna = posicionActual.getFila()-1;
    	fila = posicionActual.getColumna()-1;
    	celdas[columna][fila].setImagen(imagenMar);
    }
    
    public void update(Observable t, Object o) {
        
    	ArrayList<Nave> navesEnJuego = new ArrayList<Nave>();
        ArrayList<Posicion> posicionesARecorrer = new ArrayList<Posicion>();
        for (int i = 1; i < 11; i++){
        	for (int j = 1; j< 11; j++){
        		posicionesARecorrer.add(new Posicion(i,j));
            }
        }
        navesEnJuego = referenciaAlJuego.getNaves();
        for(Posicion posicionActual : posicionesARecorrer){
        	for(Nave naveActual : navesEnJuego){
        		if (naveActual.tieneParteEn(posicionActual)){
        			this.actualizarGrilla(posicionActual, naveActual);
        			posicionActual.setEstaOcupada(true);
        	}
            else{
            	if (!posicionActual.estaOcupada())
                    this.dibujarMar(posicionActual);
                }
            }
        }  
    }
}